#include<bits/stdc++.h>
using namespace std;
#define cx c[x]
#define ci c[i]
int n,t,m,l,v,p[100007],cnt=0,mn=0x7f7f7f;
int d[100007];
struct car{
    int d,a,v;
}c[100007];
vector<int> inc[100007];
bool flag,vis[100007];
void gett(int x){
    if(cx.a==0){
        if(cx.v>v){
            int ld=lower_bound(p+1,p+m+1,cx.d)-p;
            if(ld>m)return;

            flag=true;

            /*d[ld]++;
            d[m+1]--;*/
            cnt++;
            //cout<<ld<<' '<<m<<'\n';
            for(int i=ld;i<=m;i++){
                inc[x].push_back(p[i]);
            }
        }
    }else{
        double tim=(v+cx.v)*(v-cx.v)/2.0/cx.a+cx.d;
        if(cx.a<0){
            int ld=lower_bound(p+1,p+m+1,cx.d)-p;
            int rd=upper_bound(p+1,p+m+1,int(tim))-p-1;
            if(ld>rd)return;
            flag=true;

            /*d[ld]++;
            d[rd+1]--;*/
            cnt++;
            //cout<<ld<<' '<<rd<<'\n';
            for(int i=ld;i<=rd;i++){
                inc[x].push_back(p[i]);
            }
        }else{
            int ld=lower_bound(p+1,p+m+1,int(tim))-p;
            if(ld>m)return;
            flag=true;

            /*d[ld]++;
            d[m+1]--;*/
            cnt++;
            //cout<<ld<<' '<<m<<'\n';
            for(int i=ld;i<=m;i++){
                inc[x].push_back(p[i]);
            }
        }
    }
}
int get(){
    for(int i=1;i<(1<<m);i++){
        int ans=0;
        bool cor=true;
        for(int j=1;j<=m;j++){
            if(i&(1<<j-1)==0)continue;
            ans++;
            for(int k=1;k<=n;i++){
                for(auto u:inc[k]){
                    if(u==p[j]){
                        vis[j]=true;
                        break;
                    }
                }
            }
        }
        for(int j=1;j<=n;j++){
            if(!vis[j])cor=false;
        }
        if(cor)mn=min(ans,mn);
        memset(vis,false,sizeof(vis));
    }
    return mn;
}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    scanf("%d",&t);
    while(t--){
        memset(inc,0,sizeof(inc));
        memset(d,0,sizeof(d));
        scanf("%d %d %d %d",&n,&m,&l,&v);
        /*flag=false;
        cnt=0;*/
        for(int i=1;i<=n;i++){
            scanf("%d %d %d",&ci.d,&ci.v,&ci.a);
        }
        for(int i=1;i<=m;i++){
            scanf("%d",&p[i]);
        }
        for(int i=1;i<=n;i++){
            gett(i);
        }
        printf("%d 3\n",cnt);
        /*for(int i=1;i<=n;i++){
            for(auto u:inc[i]){
                printf("%d ",u);
            }
            printf("\n");
        }*
        for(int i=1;i<(1<<m);i++){
            int ans=0;
            bool cor=true;
            for(int j=1;j<=m;j++){
                if(i&(1<<j-1)==0)continue;
                ans++;
                for(int k=1;k<=n;i++){
                    for(auto u:inc[k]){
                        if(u==p[j]){
                            vis[j]=true;
                            break;
                        }
                    }
                }
            }
            for(int j=1;j<=n;j++){
                if(!vis[j])cor=false;
            }
            if(cor)mn=min(ans,mn);
            memset(vis,false,sizeof(vis));
        }
        cout<<mn;*/
    }
    return 0;
}
